package cn.cloud9;

public class Case4NarcissusNumber {

    /**
     * https://www.bilibili.com/video/BV18J411W7cE?p=43
     * 打印水仙花数
     * 水仙花数的条件
     * 1、三位数
     * 2、个位 十位 百位 的数字立方之和等于原数
     *
     * 案例：
     * 371 = 3的3次方（27） + 7的3次方（343） + 1的三次方（1）
     * @param args
     */
    public static void main(String[] args) {

        // 设定水仙花数的范围
        final int BEGIN = 100;
        final int END = 999;

        // 统计个数
        int count = 0;

        // 使用for走每一个数字
        for (int i = BEGIN; i <= END; i++) {

            int unit = 0;
            int decade = 0;
            int hundreds = 0;
            /**
             * 演示获取办法处理：
             * int unit = i % 10; 个位数获取
             * int decade = i / 10 % 10; 十位数获取
             * int hundreds = i / 10 / 10 % 10; 百位数获取
             */

            // 使用String处理
            String s = String.valueOf(i);
            for (int digit = s.length() - 1; digit >= 0 ; digit --) {
                int digitVal = Integer.parseInt(s.substring(digit, digit + 1));
                switch (digit + 1) {
                    case 3:
                        unit = digitVal;
                        break;
                    case 2:
                        decade = digitVal;
                        break;
                    case 1:
                        hundreds = digitVal;
                        break;
                }
            }

            final int narcissusNumber = (int)(Math.pow(unit,3) + Math.pow(decade,3) + Math.pow(hundreds,3));
            boolean isNarcissus = i == narcissusNumber;
            if (isNarcissus) {
                System.out.println(i + " - " + narcissusNumber + " 水仙花数");
                ++ count;
            }
            /**
             * 使用单字符数组获取数位上的数值来处理
             * char[] charArr = String.valueOf(i).toCharArray();
             * for (int digit = charArr.length - 1; digit >= 0; digit --) {
             *     // 注意这里是从1 -> "1"，然后"1" -> '1'变成了ASCII编码值49了
             *     //所以转换编码最简单的办法就是直接减去编码偏移量即可
             *     int val = charArr[digit] - 48 ;
             *     switch (digit + 1) {
             *         case 3:
             *             unit = val;
             *             break;
             *         case 2:
             *             decade = val;
             *             break;
             *         case 1:
             *             hundreds = val;
             *             break;
             *     }
             * }
             */

            // System.out.printf("百位%d 十位%d 个位%d\n", hundreds, decade, unit);
        }
        System.out.println("水仙花个数" + count);
    }
}
